shell 中的 分发系统 expect脚本 (传递参数、自动同步文件、指定host和要传输的文件、(构建文件分发系统)(命令批量执行))

您所在的位置:网站首页 linux 文件同步脚本 shell 中的 分发系统 expect脚本 (传递参数、自动同步文件、指定host和要传输的文件、(构建文件分发系统)(命令批量执行))

shell 中的 分发系统 expect脚本 (传递参数、自动同步文件、指定host和要传输的文件、(构建文件分发系统)(命令批量执行))

2023-06-04 14:27| 来源: 网络整理| 查看: 265

shell 中的 分发系统 expect脚本 (传递参数、自动同步文件、指定host和要传输的文件、(构建文件分发系统)(命令批量执行)) 精选 原创

想剪个寸头 2022-07-31 19:13:11 ©著作权

文章标签 vim ip地址 绝对路径 linux expect 文章分类 运维

©著作权归作者所有:来自51CTO博客作者想剪个寸头的原创作品,请联系作者获取转载授权,否则将追究法律责任 expect脚本编写示例 没有的话yum安装 yum -y install expect 需求1:执行脚本时自动远程登入 #!/usr/bin/expect 脚本格式注释 set host "192.168.44.128" 在expect里面要使用set指定 host 指定要连接的i地址 set passwd "123456" sed 指定密码 spawn ssh root@$host expect使用spawn后面跟shell的系统命令使用ssh远程指定登入 expect { expect的语句格式 "yes/no" { send "yes\r"; exp_continue } 初次登入一台新机器时会提示,表示上面的远程连接执行时匹配到到yes/no时 执行后面{}里的内容 出现则执行yes \r 表示回车 未匹配到则继续执行exp_continue 表示继续执行下面的内容 "password:" { send "$passwd\r" } 表示匹配到 password 时 执行{}里的内容 $passwd 表示上面的指定的变量 即密码 然后\r 回车执行 } interact 结束 (interact这里表示远程登入之后停留在该机器上不退出 如果要退出的话 使用 expect eof 使用之后 登入之后会停留几秒钟退出来 如果interact 和 expect eof 都不加 登录之后马上就会退出来 ) chmod +x 脚本名称 然后增加权限 ./脚本名称 执行 如图执行结果验证

image.png

需求2:执行脚本时自动远程登入,并执行某个命令再退出来 #!/usr/bin/expect set user "root" set passwd "123456" spawn ssh [email protected] expect { "yes/no" { send "yes\r" ; exp_continue } "password:" { send "$passwd\r" } } 上方内容于上面意思表达一致 expect "]*" 表示登入之后匹配 ]* 时 send "touch /root/123\r" 执行" " 里的命令 下方内容一致 依次执行 expect "]*" send "echo 123456 > /root/123\r" expect "]*" send "exit\r" 直至这里执行exit退出 chmod +x 脚本名称 然后增加权限 ./脚本名称 执行 如图执行结果验证

image.png

登入被远程的机器验证 image.png

expect 传递参数 #!/usr/bin/expect set user [lindex $argv 0] 指定第一个参数 (参数信息参考根据下列执行脚本时的格式) set host [lindex $argv 1] 指定第二个参数 set passwd "123456" 指定登入密码 set abc [lindex $argv 2] 指定abc 的参数 (第三个参数) spawn ssh $user@$host 远程登入 expect { "yes/no" {send "yes\r"} "password:" { send "$passwd\r" } } expect "]*" 登入之后当达到匹配条件时 send "$abc\r" 执行输入的第三个参数 expect "]*" 达到条件时 send "exit\r" 退出 执行脚本格式 chmod +x 3.sh 加执行权限 3.sh root 192.168.44.128 "touch /usr/123;echo 123456 > /usr/123" root 为第一个参数 ip为 第二个参数 后面的命令为第三个参数 可以使用单个命令 或 多个命令 使用多个命令时 用双引号且冒号分开 如图一执行结果验证 图二远程机器验证

image.png

image.png

expect 自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -av [email protected]:/usr/local/src /root/src //指定同步命令 expect { "yes/no" { send "yes\r" } "password:" { send "$passwd\r" } } expect eof chmod +x 4.sh 加权限 ./4.sh 执行 如图验证

image.png

expect 指定host和要传输的文件 #!/usr/bin/expect set passwd "123456" set host [lindex $argv 0] 指定第一个参数 set file [lindex $argv 1] 指定第二个参数 spawn rsync -av $file root@$host:$file 指定本地传输到远程 如果要远程传输到本地 更换命令位置即可 expect { "yes/no" { send "yes\r" } "password:" { send "$passwd\r" } } expect eof chmod +x 5.sh 加权限 ./5.sh 执行 ./5.sh 192.168.44.128 "/root/1.sh" 执行脚本命令 (路径最好写绝对路径) 格式理解 同上面介绍一样 如图一执行结果验证 图二远程机器验证

image.png

image.png

expect 构建文件分发系统 需求: 为多个ip地址同步目录文件(即a机器的目录文件同步到b、c、d......) (此脚本需要知道每个被传机器的password 且一致 ) vim 6.sh #!/usr/bin/expect set passwd "123456" 指定密码 set host [lindex $argv 0] 指定参数 set file [lindex $argv 1] 指定参数 spawn rsync -avR--files-from=$file / root@$host:/ 核心命令 源目录是"/"(根) 目标目录也是根 expect { "yes/no" { send "yes\r" } "password:" { send "$passwd\r" } } expect eof chmod +x 6.sh 增加执行权限 然后需要在a机器上创建一个文件 包含需要传输同步的目录文件路径 例如: vim /usr/file.txt /ust/123.txt (这里故意写错一个路径 方便后面验证) /root/123/aaa.txt (一定写绝对路径 且前面的路径目标机器上要有,最后的文件路径没有没关系) /etc/abc/bbb.txt (如果不确定目标机器路径是否存在 上方核心命令参数中 rsync -avR 加上R) 然后再在a机器上创建一个文件 包含被传机器的IP地址 例如: vim /usr/ip.txt 192.168.44.128 192.128.44.131 (这里ip也写错一个) 然后创建一个shell脚本 vim 7.sh #!/bin/bash for i in `cat /usr/ip.txt` 首先循环遍历ip地址 (上面定义的被传机器的ip) do ./6.sh $i /usr/file.txt 然后使用6.sh的expect脚本 进行传输file.txt里面的目录文件 done 结束 chmod +x 7.sh 增加执行权限 ./7.sh 执行 如图一所示执行过程 图二远程机器验证同步结果

image.png

image.png

expect 命令批量执行 同上文件分发系统配置一样 首先编写expect 脚本 vim 8.sh #!/usr/bin/expect set host [lindex $argv 0] set passwd "123456" set abc [lindex $argv 1] spawn ssh root@$host expect { "yes/no" { send "yes\r" } "password:" { send "$passwd\r" } } expect "]*" send "$abc\r" expect "]*" send "exit\r" chmod +x 8.sh 增加执行权限 然后编写被控制机器的IP地址文档 vim vim /usr/ip.txt 192.168.44.128 192.168.44.131 最后编写 shell 脚本 vim 9.sh #!/bin/bash for i in `cat /usr/ip.txt` 循环遍历ip文档的内容 do ./8.sh $i "hostname" 使用8.sh的expect脚本执行 对每个IP地址的机器执行hostname 命令 done chmod +x 9.sh 增加执行权限 ./9.sh 执行 如图查看验证执行过程

image.png

===============================================================

本文章参考《跟aming学linux书籍》

打赏 收藏 评论 分享 举报

上一篇:linux 下vi/vim使用

下一篇:llinux 防火墙(selinux 防火墙、firewalld 、netfilter (iptables))及iptables 规则备份和恢复



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3